HTTP Live Streaming
概要
2009 年に Internet-Draft が公開され、その後数多くの実装が登場し、議論が重ねられてきた。2020 年現在は RFC 8216 として仕様が公開されており、ファイルのデータフォーマット, サーバ/クライアントのとるべきアクション について規定されている。
概念
HLS のプロトコルを読み進めていく上で登場する概念について軽くまとめておく。 Multimedia Presentation
再生対象のマルチメディア
Praylist への URI で定義される
Playlist
どちらも URI および タグ を含んだ UTF-8 テキストになる
拡張子は m3u8
https://gyazo.com/1af7df16fdae73f1b044026fef4510f4
同一コンテンツの別バージョンのこと
同一のコンテンツの代替バージョンのこと。例えば、以下のようなものがある。
単一の映像に対して、異なる言語の複数の音声
単一の音声に対して、異なるカメラアングルから撮影された複数の映像
ユーザ設定に応じて、適切な Rendition に切り替えられることが望ましい
Master Playlist 内で #EXT-X-MEDIA で記述される
https://gyazo.com/e9406ba2e7829bbe24112f990aba2d2f
連続で再生すると、Multimedia Presentation の再生と同義になる
1 つ以上のトラックをもち、映像、音声、音声が埋め込まれた映像、あるいはサブタイトルになる。
https://gyazo.com/906af95aaf0f9a7beee96b1cb23ee446
タグ (WIP)
Master Playlist および Media Playlist には、タグを記述できる。このタグの主な用途は以下になる。
Playlist のグローバルなパラメータを定義する
Media Segments や Media Playlist に関する情報を定義する
基本のタグ
EXTM3U
そのファイルが Extended M3U プレイリストファイルであることを示す。Playlist の最初の行に 必ず 必要。
EXT-X-VERSION
その Playlist ファイルが準拠する HLS のプロトコルバージョンを記述する。プロトコルバージョン1以外でサポートされる記述を利用する場合には必須。プロトコルバージョンの詳細についは下記を参照。
Media Segment Tags
EXT-X-KEY
Media Segment が暗号化されている場合、それを復号化するための情報が格納される。このタグに付与できる属性は以下がある。
METHOD:
暗号化方法を示す。NONE, AES-128, SAMPLE-AES のいずれか
NONE は暗号化されていないことを示す
AES-128 は 128 bit のキーを用いた Advanced Encryption Standard による暗号化
IV
128bit の 16進数
KEYFORMAT
URI で示されたリソースないでキーがどのように表現されているかを定義する
Media Playlist Tags
EXT-X-TARGETDURATION
EXT-X-MEDIA-SEQUENCE
EXT-X-DISCONTINUITY-SEQUENCE
EXT-X-ENDLIST
EXT-X-PLAYLIST-TYPE
その Media Playlist について、提供元であるサーバが保証すべき可変性を記述する。EVENT もしくは VOD (Video On Demand) のどちらかをとり、EVENT の場合は、一部の変更、削除は許可されないが、末尾に Media segments が追加される可能性がある。VOD の場合は、変更してはいけない。このタグがない場合は、Playlist の変更は仕様 (仕様書 6.2.1) に従う (割愛)。
EXT-X-I-FRAMES-ONLY
Playlist 内の各 Media segments が単一の I-frame であることを表す。I-frame とは、他のフレームに依存せずエンコードされたビデオフレーム。
Master Playlist Tags
EXT-X-MEDIA, EXT-X-STREAM-INF
EXT-X-MEDIA は、Rendition を記述できるタグ。Rendition とは、同一のコンテンツに対する、複数の代替可能なバージョン のこと。例えば、同一の映像に対する、異なる言語の複数の音声や、同一の音声に対する、異なるアングルからの複数の映像などを記述できる。どれを選択するかは、クライアント側の設定によって決められるようになっているべき。
Rendition は、グループを形成することができる。例えば、同一の映像に対して、異なる言語の複数の音声と、異なる言語の複数の字幕があった場合、音声の Rendition Group と字幕の Rendition Group の2つが定義できる。EXT-X-MEDIA タグには、このグループを一意に識別する識別子として GROUP-ID がある。
また、Rendition 自体の種類も決まっており、そちらは TYPE 属性に記述できる。音声 (AUDIO), 映像 (VIDEO), 字幕 (SUBTITLE), CC (CLOSED-CAPTION) の4つがサポートされている。
Rendition Group は、この TYPE と GROUP-ID の組み合わせで一意に定められる。
その他にも、複数の Rendition のなかでどれをデフォルトとするか設定できる DEFAULT 属性や、Rendition 自体を一意に識別できる NAME 属性なども存在する。
一方、EXT-X-STREAM-INF は、Variant Stream を記述できるタグ。Variant Stream とは、同一コンテンツに対する、解像度やビットレート、フォーマットが異なる別のバージョン のこと。
下記は、EXT-X-MEDIA, EXT-X-STRAM-INF の例。
code:sample.m3u8
lo/prog_index.m3u8
mid/prog_index.m3u8
hi/prog_index.m3u8
上記の Playlist には、以下のような Rendition および Variant Stream が含まれている。実際の再生時には、これらの組み合わせをネットワーク状態やユーザ設定に基づいて決定し、再生する。
table:Rendition
TYPE NAME
AUDIO 日本語
AUDIO English
AUDIO 中文
SUBTITLES 日本語
SUBTITLES English
SUBTITLES 中文
table:VariantStream
ビットレート 解像度
140205 256x144
410170 640x360
920179 1280x720
EXT-X-I-FRAME-STREAM-INF
EXT-X-SESSION-DATA
EXT-X-SESSION-KEY
Media もしくは Master Playlist
EXT-X-INDEPENDENT-SEGMENTS
EXT-X-START
サンプル
Media Playlist
下記が、Playlist (Media Playlist) の例。クライアントは、Playlist を再生するためには以下の手順をふむ。
1. Playlist を HTTP で DL
2. 各 Media segment を DL & 再生
3. Playlist は定期的にリロードする? (追加された segment がないか見つけるためのようだ)
code:Playlist
Master Playlist
2018/09/17時点、Twitter の映像ファイルについてちょっと覗かせてもらうと、以下のような形式になっていた。
code:text
/fuga/hoge.m3u8
/fuga/hoge.m3u8
/fuga/hoge.m3u8
EXT-X-STREAM-INF タグが利用されている。これは Variant Stream を示しており、Redition の集合が情報として付加されている。また、続く行には Media Playlist が示されている。 パラメータをみるに、異なるサイズ、bandwidth のための Media Playlist が列挙されているようだ。どのような場合にどの Redition が選択されるのかは今の所よくわからない。
また、URI には相対パスが指定されていた。Playlist 内の相対パスについては以下に記述されていた。URI が相対パスであった場合、それを含んだ Playlist に対する相対パスとしてみなされるようだ。
A URI in a Playlist, whether it is a URI line or part of a tag, MAY be relative. Any relative URI is considered to be relative to the URI of the Playlist that contains it.
しかし、Twitter の場合は https://video.twimg.com/ からの相対パスが記述されているようだった。
改めて MediaPlaylist を GET してみると、以下のようになっていた。
code:text
/hoge/fuga.ts
/hoge/fuga.ts
...
その他